"""
邮件模板相关的API路由
"""

from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from typing import Optional, List

from database import get_db
from schemas.email_template import (
    EmailTemplateCreate, EmailTemplateUpdate, EmailTemplateResponse, EmailTemplateList,
    TemplatePreviewRequest, TemplatePreviewResponse, TemplateVariableExtractRequest,
    TemplateVariableExtractResponse, TemplateStatistics, TemplateCloneRequest,
    TemplateType, TemplateCategory
)
from services.email_template_service import EmailTemplateService
from utils.dependencies import get_current_active_user
from models.user import User

router = APIRouter()


@router.post("/", response_model=EmailTemplateResponse, summary="创建邮件模板")
async def create_email_template(
    template_data: EmailTemplateCreate,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    创建新的邮件模板
    
    - **name**: 模板名称
    - **subject**: 邮件主题
    - **content**: 邮件内容
    - **template_type**: 模板类型（html/markdown/plain_text）
    - **category**: 模板分类
    - **description**: 模板描述（可选）
    - **variables**: 模板变量列表（可选，会自动提取）
    - **is_active**: 是否启用
    """
    template = EmailTemplateService.create_email_template(db, template_data, current_user.id)
    return EmailTemplateResponse.from_orm(template)


@router.get("/", response_model=EmailTemplateList, summary="获取邮件模板列表")
async def get_email_templates(
    page: int = Query(1, ge=1, description="页码"),
    size: int = Query(10, ge=1, le=100, description="每页数量"),
    search: Optional[str] = Query(None, description="搜索关键词"),
    category: Optional[TemplateCategory] = Query(None, description="模板分类过滤"),
    template_type: Optional[TemplateType] = Query(None, description="模板类型过滤"),
    active_only: bool = Query(False, description="仅显示启用的模板"),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    获取邮件模板列表，支持分页、搜索和过滤
    
    - **page**: 页码（从1开始）
    - **size**: 每页数量（1-100）
    - **search**: 搜索关键词（可选）
    - **category**: 模板分类过滤（可选）
    - **template_type**: 模板类型过滤（可选）
    - **active_only**: 仅显示启用的模板（可选）
    """
    return EmailTemplateService.get_email_templates(
        db, current_user.id, page, size, search, category, template_type, active_only
    )


@router.get("/{template_id}", response_model=EmailTemplateResponse, summary="获取邮件模板详情")
async def get_email_template(
    template_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    获取指定邮件模板的详细信息
    
    - **template_id**: 模板ID
    """
    template = EmailTemplateService.get_email_template(db, template_id, current_user.id)
    if not template:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="模板不存在"
        )
    return EmailTemplateResponse.from_orm(template)


@router.put("/{template_id}", response_model=EmailTemplateResponse, summary="更新邮件模板")
async def update_email_template(
    template_id: int,
    template_data: EmailTemplateUpdate,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    更新指定邮件模板的信息
    
    - **template_id**: 模板ID
    - **name**: 模板名称（可选）
    - **subject**: 邮件主题（可选）
    - **content**: 邮件内容（可选）
    - **template_type**: 模板类型（可选）
    - **category**: 模板分类（可选）
    - **description**: 模板描述（可选）
    - **variables**: 模板变量列表（可选）
    - **is_active**: 是否启用（可选）
    """
    template = EmailTemplateService.update_email_template(db, template_id, template_data, current_user.id)
    if not template:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="模板不存在"
        )
    return EmailTemplateResponse.from_orm(template)


@router.delete("/{template_id}", summary="删除邮件模板")
async def delete_email_template(
    template_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    删除指定的邮件模板
    
    - **template_id**: 模板ID
    """
    success = EmailTemplateService.delete_email_template(db, template_id, current_user.id)
    if not success:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="模板不存在"
        )
    return {"message": "模板删除成功"}


@router.post("/{template_id}/toggle", response_model=EmailTemplateResponse, summary="切换模板状态")
async def toggle_template_status(
    template_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    切换指定模板的启用/禁用状态
    
    - **template_id**: 模板ID
    """
    template = EmailTemplateService.toggle_template_status(db, template_id, current_user.id)
    if not template:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="模板不存在"
        )
    return EmailTemplateResponse.from_orm(template)


@router.post("/preview", response_model=TemplatePreviewResponse, summary="预览模板")
async def preview_template(
    preview_request: TemplatePreviewRequest,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    预览模板渲染效果
    
    - **template_id**: 模板ID（可选，与content二选一）
    - **subject**: 邮件主题（可选）
    - **content**: 邮件内容（可选）
    - **template_type**: 模板类型
    - **variables**: 模板变量值
    """
    return EmailTemplateService.preview_template(db, preview_request, current_user.id)


@router.post("/extract-variables", response_model=TemplateVariableExtractResponse, summary="提取模板变量")
async def extract_template_variables(
    extract_request: TemplateVariableExtractRequest,
    current_user: User = Depends(get_current_active_user)
):
    """
    从模板内容中提取变量
    
    - **content**: 模板内容
    - **subject**: 邮件主题（可选）
    """
    return EmailTemplateService.extract_template_variables(extract_request)


@router.post("/clone", response_model=EmailTemplateResponse, summary="克隆模板")
async def clone_template(
    clone_request: TemplateCloneRequest,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    克隆现有模板
    
    - **template_id**: 要克隆的模板ID
    - **new_name**: 新模板名称
    """
    template = EmailTemplateService.clone_template(db, clone_request, current_user.id)
    return EmailTemplateResponse.from_orm(template)


@router.get("/statistics", response_model=TemplateStatistics, summary="获取模板统计")
async def get_template_statistics(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    获取当前用户的模板统计信息
    
    - 总模板数
    - 启用模板数
    - 按分类分布
    - 按类型分布
    - 最近7天新增数量
    """
    return EmailTemplateService.get_template_statistics(db, current_user.id)


@router.get("/active/list", response_model=List[EmailTemplateResponse], summary="获取启用的模板")
async def get_active_templates(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    获取当前用户所有启用的模板
    """
    templates = EmailTemplateService.get_active_templates(db, current_user.id)
    return [EmailTemplateResponse.from_orm(template) for template in templates]


@router.get("/search/autocomplete", response_model=List[EmailTemplateResponse], summary="模板搜索自动完成")
async def search_templates_autocomplete(
    q: str = Query(..., min_length=1, description="搜索关键词"),
    limit: int = Query(10, ge=1, le=50, description="返回数量限制"),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    """
    模板搜索自动完成，用于输入框提示
    
    - **q**: 搜索关键词
    - **limit**: 返回数量限制（1-50）
    """
    templates = EmailTemplateService.search_templates(db, current_user.id, q, limit)
    return [EmailTemplateResponse.from_orm(template) for template in templates]
